草庐IT

mySQL DELIMITER 抛出 1064

全部标签

c++ - 抛出异常时是否需要 va_end?

我有一个基于printf样式格式的日志记录框架:voidLogger::debug(constchar*fmt,...){va_listargs;va_start(args,fmt);this->output(DebugLevel,fmt,args);va_end(args);}如果Logger::output抛出异常,编译器是否会正确展开堆栈,或者我是否需要在捕获条款?这可以改为RAII,还是va_end太神奇了?如果可能,请包括对标准的引用。 最佳答案 不,他们不能。因为它们是宏而不能的推理是愚蠢的。宏可以毫无问题地从构造函数和

c++ - 查找抛出 std::out_of_range 的对象

我的一个程序抛出一个std::out_of_range。我知道这样做的原因,我正在某处访问索引为-1的vector。我不知道的是vector的名称(变量名称)和代码中的位置。我的程序产生的错误消息如下所示:terminatecalledafterthrowinganinstanceof'std::out_of_range'what():vector::_M_range_checkzsh:abort(coredumped)./main.xconfig.cfg而由其他人(他也使用g++)的代码生成的错误消息发布在问题C++accessingvector中看起来像这样:Errorforvec

c++ - 从 std::call_once 抛出异常

C++标准对使用抛出异常的函数执行std::call_once(§30.4.4.2/2)作了如下说明:2/Effects:Anexecutionofcall_oncethatdoesnotcallitsfuncisapassiveexecution.Anexecutionofcall_oncethatcallsitsfuncisanactiveexecution.AnactiveexecutionshallcallINVOKE(DECAY_-COPY(std::forward(func)),DECAY_COPY(std::forward(args))...).Ifsuchacallto

c++ - 在实现非抛出交换时我应该使用 throw() 吗?

在实现非抛出交换习语时,我应该使用throw()吗?namespaceA{structB{voidswap(B&other)throw(){/*fancystuffthatdoesn'tthrow*/}};voidswap(B&lhs,B&rhs)throw(){lhs.swap(rhs);}}namespacestd{templatevoidswap(A::B&lhs,A::B&rhs)throw(){lhs.swap(rhs);}}我特别担心将throw()规范放在std::swap的特化上。奖励问题:使用C++0x的noexcept关键字时答案是否不同?

c++ - 不抛出但依赖于抛出的库的类

我写了一些不抛出异常的类,但它们使用了STL,而STL可以抛出异常。例如,在我的类(class)中有使用std::vector、std::list、std::string的函数。STL在复制字符串或创建vector时可能会抛出错误,对吗?所以我不能将我的类(class)描述为没有异常,对吧?遇到这种情况你们怎么办?您是否将每个函数都包装在try/catch中?你如何描述你的类(class)?谢谢 最佳答案 正确,如果您从特定成员函数调用的任何内容(包括构造函数、编译器为您提供的隐式调用等)可以抛出异常,那么该成员函数也可以抛出异常。

c++ - 初始化原子指针是原子的吗?如果初始化或内存分配抛出会发生什么?

如果我一次性声明并定义一个原子指针,比如-std::atomiciptr=newint(1);std::atomiciptr=newT();据我了解,整个操作不是原子的。newT()涉及分配内存,构造T对象,然后自动分配给iptr。T可能很容易构造,在这种情况下,构造T不应抛出异常,但某些用户定义的T可能会抛出异常。如果在T构造或内存分配之间某个其他线程使用iptr怎么办?这个操作真的是原子的吗?使其成为原子的一种方法是打破声明和定义,例如T*temp=newT();std::atomiciptr=temp;有没有其他方法可以原子地做同样的事情?我的理解有问题吗?

c++ - 抛出表达式中是否允许右值省略

在§[except.throw]中,标准规定抛出异常会从throw表达式复制初始化异常对象Throwinganexceptioncopy-initializes(11.6,15.8)atemporaryobject,calledtheexceptionobject为什么下面的代码可以在C++17上编译?classException{public:Exception()=default;Exception(Exception&&)=delete;Exception(constException&)=delete;};intmain(){throwException{};return0;}

c++ - catch(...) 中的 throw 是按值还是按引用抛出

我老板回答了这个问题why...(threepoints)incatchblockisexist?非常优雅。但这让我想到了一些事情(并希望弥补我之前的错误问题),确实catch(...){throw;}通过值(即采用深拷贝)或通过引用重新抛出捕获的异常? 最佳答案 标准说:Athrow-expressionwithnooperandrethrowsthecurrentlyhandledexception.Theexceptionisreactivatedwiththeexistingtemporary;nonewtemporarye

c++ - 什么是在此文件流中抛出异常?

我不明白是什么在我的输入文件流中抛出异常。我以前做过几乎完全一样的事情,没有任何问题。std::stringaccnts_input_file="absolute_path/account_storage.txt";std::stringstrLine;std::ifstreamistream;istream.exceptions(std::ifstream::failbit|std::ifstream::badbit);try{istream.open(accnts_input_file.c_str());while(std::getline(istream,strLine)){st

c++ - 为什么允许在 noexcept 标记的函数中抛出异常?

我很难理解这一点。doublecompute(doublex,doubley)noexcept{if(y==0)throwstd::domain_error("yiszero");returnx/y;}这在clang中编译得很好(我没有检查gcc),但对我来说这似乎是胡说八道。为什么编译器会允许noexcept函数包含throw语句? 最佳答案 将发生的是std::terminate()被触发,因为您的异常规范不允许发生这种情况(参见[except.spec/9])。至于为什么允许这样做,根本不可能彻底检查是否有任何违反规范的地方。